// NombreComplexe.C
// Implantation du module NombreComplexe offrant le type Complexe
//  -> implantation des operations, procedures et fonctions
//     permettant de manipuler des Complexes,
//  -> implantation des variables et constantes globales 
//      offertes par le module


//Modules utilises dans l'implantation
#include <cstdio>
#include "Reel.H" // offrant le type Reel

// On rajoute :
#include "NombreComplexe.H" // contenant la definition du type Complexe

//  Definition constantes globales exportees
//  ie. qui pourront etre utilisees dans d'autres modules
//  s'ils importent le module NombreComplexe
const Reel PI=3.1425;

//  Definition variables globales exportees
//  Aucune ici 

//  Definition d'une variable globale non exportee
//  (Utilisable uniquement dans le module NombreComplexe)
static int nbComplexe=0;


void initialisation1(Complexe & c)
{
  c.x=c.y=0;
  nbComplexe++;
}

void initialisation2(Complexe & c1, const Complexe & c2)
{
  c1.x=c2.x; 
  c1.y=c2.y;  
  nbComplexe++;  
}

void initialisation3(Complexe & c, Reel a, Reel b)
{
  c.x=a; 
  c.y=b;
  nbComplexe++;
}

void testament(Complexe & c)
{
  nbComplexe--;
}

void affectation(Complexe & c1, const Complexe & c2)
{
  if (&c1!=&c2)
    {
      c1.x=c2.x;
      c1.y=c2.y;
    }
}

Complexe addition(const Complexe & c1, const Complexe & c2)
{
  Complexe res; 
  /*pas d'appel a initialisation comme on ne pourra pas invoquer testament*/
  res.x=c1.x+c2.x;
  res.y=c1.y+c2.y;  
  return res;
}

void affiche(const Complexe & c)
{
  std::printf("Affichage %f+i*%f \n",c.x,c.y);
}

int nbComplexesVivants()
{
  return nbComplexe;
}
